package org.cnam.mobileShopping.controller;

import java.io.IOException;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import org.cnam.mobileShopping.bean.Constants;
import org.cnam.mobileShopping.bean.MList;
import org.cnam.mobileShopping.bean.Product;
import org.cnam.mobileShopping.bean.Productlist;
import org.cnam.mobileShopping.dao.DAOFactory;
import org.cnam.mobileShopping.dao.ProductDAO;
import org.cnam.mobileShopping.dao.ProductlistDAO;
import org.cnam.mobileShopping.util.MobileShoppingUtils;
import org.cnam.mobileShopping.wsclient.WSClient;
import org.json.JSONException;

import android.content.Context;
import android.util.Log;

/**
 * Controller sur les ProductList (produits appartenant à des listes) permettant
 * de les retrouver, les sauvegarder et ainsi de suite
 */
public class ProductListController {

	public List<Productlist> findAll() {
		return null;
	}

	public void synchronise(Date lastupdate, Integer userId) {
	}

	/**
	 * Création d'un produit liste
	 * 
	 * @param context
	 *            Contexte permettant l'accès à la base de données
	 * @param obj
	 *            Produit liste
	 * @return Le produit liste ainsi créé
	 */
	public static Productlist createProductList(Context context, Productlist obj) {

		Productlist pl = null;
		try {
			obj.setSynchr(false);
			obj.setCommonid(UUID.randomUUID().toString());
			long id = DAOFactory.getProductListDAO(context).create(obj);
			pl = DAOFactory.getProductListDAO(context).find((int) id);
			MList list = DAOFactory.getListeDAO(context).find(pl.getMlistid());
			// on teste la connection avant l'appel au webservice
			if (MobileShoppingUtils.isConnected(context)) {
				Productlist plInServer = WSClient.getInstance()
						.addProductInList(list.getCommonid(), pl,
								obj.getUserid());
				pl.setSynchr(true);
				pl.setVersion(plInServer.getVersion());
				DAOFactory.getProductListDAO(context).update(pl);
			}

		} catch (JSONException e) {
			Log.e("MobileShopping", e.getMessage());
		} catch (IOException e) {
			Log.e("MobileShopping", e.getMessage());
		}

		return pl;
	}

	/**
	 * Suppression d'un produit liste, donc envoit au webservice de la
	 * suppression de ce dernier
	 * 
	 * @param obj
	 *            L'objet à supprimer
	 * @return True ==> Ok objet bien enlevé
	 */
	public static boolean delete(Context context, Productlist obj) {
		String userId = MobileShoppingUtils.getSharedPreferences(context,
				"userid");
		try {
			// envoit de la suppression au WS
			// on teste la connection avant l'appel au webservice
			if (MobileShoppingUtils.isConnected(context)) {
				WSClient.getInstance().deleteProductInList(obj.getCommonid(),
						Integer.parseInt(userId));
			}
			DAOFactory.getProductListDAO(context).delete(obj);

			return Boolean.TRUE;

		} catch (NumberFormatException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return Boolean.FALSE;
	}

	public static boolean update(Context context, Productlist obj) {
		String userId = MobileShoppingUtils.getSharedPreferences(context,
				"userid");
		try {
			obj.setSynchr(false);
			DAOFactory.getProductListDAO(context).update(obj);

			// on teste la connection avant l'appel au webservice
			if (MobileShoppingUtils.isConnected(context)) {

				Productlist productlistInServer = WSClient.getInstance()
						.updateProductInList(obj, Integer.parseInt(userId));
				if (productlistInServer != null
						&& productlistInServer.getVersion() == obj.getVersion() + 1) {
					obj.setVersion(productlistInServer.getVersion());
					obj.setSynchr(true);
				} else {
					Log.e("MobileShopping", "update of productlist is nok");
				}
			}

			return Boolean.TRUE;
		} catch (NumberFormatException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (JSONException e) {
			e.printStackTrace();
		}
		return Boolean.FALSE;
	}

	public static Productlist find(Context context, int id) {
		return DAOFactory.getProductListDAO(context).find(id);
	}

	/**
	 * Récupération d'un productList et donc récupération du produit associé
	 * afin de l'affecter
	 * 
	 * @param context
	 *            Le contexte d'accès à la base de données
	 * @param idList
	 *            L'id de la liste en cours
	 * @param quantity
	 *            La quantité du produit
	 * @param userId
	 *            L'id de l'user qui a ajouté ce produit
	 * @param barcode
	 *            Le code barre du produit
	 * @return
	 */
	public static Productlist getProduct(Context context, int idList,
			int quantity, int userId, String barcode) {
		// dans un premier temps on va checker le produit
		Product p = ((ProductDAO) DAOFactory.getProductDAO(context))
				.findByBarcode(barcode);
		// est ce que le produit existe?
		if (p == null) {
			return null;
		}

		Productlist pl = new Productlist(idList, -1, quantity,
				Integer.valueOf(Constants.statusList.EDITABLE.getId()), userId,
				p.getProductid(), new Date());
		pl.setProduct(p);
		return pl;
	}

	public static List<Productlist> findByList(Context context, int idList) {
		return ((ProductlistDAO) DAOFactory.getProductListDAO(context))
				.findByList(idList);
	}

}
